Elasticsearch高级调优方法论之——根治慢查询!
The following article is from 铭毅天下 Author 铭毅天下
1、引言
2、Elasticsearch慢查询六大症状及解决方案
2.1 症状1:非活动(检索/写入)状态资源利用率也非常高
2.1.1 问题描述
2.1.2 解决方案
1、部署之前,设计先行。
正如VIVO搜索技术总监振涛兄所说:“集群规划核心是容量预估,就好比你建个楼,必须规划好容量,不然说用多少就建多高,吃在地基撑不住!!”。任何部署的良好开端都是执行适当的容量规划,以帮助确定每个搜索用例的最佳分片数。 2、减少分片数,实施冻结索引或添加其他节点以实现负载均衡。 3、考虑冷热数据分离架构(适用于基于时间的索引)以及Elasticsearch中的翻转索引(rollover)/压缩索引(shrink)功能,以有效管理分片计数。
https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
https://www.elastic.co/cn/blog/hot-warm-architecture-in-elasticsearch-5-x
https://www.elastic.co/guide/en/elasticsearch/guide/master/capacity-planning.html
2.2 症状2:线程池存在大量rejected
2instance-0000000001 search 0 10 0
3instance-0000000002 search 0 20 0
4instance-0000000003 search 0 30 0
2.2.1 问题描述
2.2.2 解决方案
使用索引模板是在创建索引阶段做好设置是个好方法。(7.0及更高版本默认1主1副)。
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/tune-for-indexing-speed.html#_use_faster_hardware
2.3 症状3:高CPU和索引化延迟
2.3.2 解决方案
1)数据初始化阶段refresh设置 -1、副本设置为 0,以提升写入速度;写入完毕后复原。
2)关闭swapping。
3)使用文件系统缓存。
4)使用自动生成ID。
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/tune-for-indexing-speed.html#_disable_refresh_and_replicas_for_initial_loads
2.4 症状4:副本增加后延时增大
2.4.1 问题描述
2.4.2 解决方案
2{ "index.requests.cache.enable": true }
2.5 症状5:共享硬件资源时的高资源利用率。
2.5.1 问题描述
2.5.2 解决方案
2.6 症状6:聚合N多唯一值引起的高内存使用率
2.6.1 问题原因
高基数——列中有很多唯一值(),如主键 低基数——与之相反,如性别列(只有男、女)。
2.6.2 解决方案
3 偶发慢查询解决方案
3.1 偶发慢查询关联监控指标
1)CPU负载 2)索引吞吐量 3)搜索吞吐量 4)垃圾收集(GC)活动 5)搜索线程池队列大小
3.2 ARS提升检索吞吐率
4 非偶发慢查询解决方案
4.1 “拆解DSL”排查慢查询根源
1)没有高亮显示它仍然很慢吗? 2)没有聚合,它仍然很慢吗? 3)如果size设置为0,它仍然很慢吗?
当size设置为0时,Elasticsearch会缓存搜索请求的结果,以便更快地进行搜索
4.2 参考官方搜索优化建议,看是否凑效?
4.3 慢查询排除实践
1)启用"profile:true"。
2{
3 "profile": true,
4 "query" : {
5 "match" : { "message" : "some number" }
6 }
7}
2)查看节点的热点线程。
3)使用kibana可视化profile分析工具
5 捕获慢查询、耗费资源查询
5.1 慢查询、耗费资源查询难捕获
5.2 dump堆内存分析
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/heap-dump-path.html
5.3 Elasticsearch的保护设置
该最大桶聚合设置停止执行并且使搜索请求失败。
5.4 断路器设置
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/circuit-breaker.html#request-circuit-breaker
5.5 慢日志分析
1)查询需要多长时间? 2)查询请求正文的内容是什么?
2search_type[QUERY_THEN_FETCH], total_shards[10], source[{"size":0,"query":{"bool":{"must":[{"range":{"timestamp":{"from":1549266459837,"to":1549871259837,"include_lower":true,
3"include_upper":true,"format":"epoch_millis","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},"_source":{"includes":[],"excludes":[]},"stored_fields":"*","docvalue_fields":
4[{"field":"timestamp","format":"date_time"},{"field":"utc_time","format":"date_time"}],"script_fields":{"hour_of_day":{"script":{"source":"doc['timestamp'].value.getHourOfDay()",
5"lang":"painless"},"ignore_failure":false}},"aggregations":{"maxAgg":{"max":{"field":"bytes"}},"minAgg":{"min":{"field":"bytes"}}}}], id[]],
日志拆分项 | 描述 |
5.6 日志审计(高阶功能,低版本非付费会员建议跳过)
1)查询是什么时候发生的? 2)谁执行了查询? 3)查询的内容是什么?
1)启用安全审计日志: 在elasticsearch.yml中设置 xpack.security.audit.enabled:true。 2)在安全审计输出中启用日志或索引: 在elasticsearch.yml中设置 xpack.security.audit.outputs:[logfile,index]。
3)在事件列表中包含authentication_success访问权限
在elasticsearch.yml中设置xpack.security.audit.logfile.events.include: authentication_success
6、小结
END
关注我
公众号(zhisheng)里回复 面经、ES、Flink、 Spring、Java、Kafka、监控 等关键字可以查看更多关键字对应的文章
Flink 实战
1、《从0到1学习Flink》—— Apache Flink 介绍
2、《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门
3、《从0到1学习Flink》—— Flink 配置文件详解
4、《从0到1学习Flink》—— Data Source 介绍
5、《从0到1学习Flink》—— 如何自定义 Data Source ?
6、《从0到1学习Flink》—— Data Sink 介绍
7、《从0到1学习Flink》—— 如何自定义 Data Sink ?
8、《从0到1学习Flink》—— Flink Data transformation(转换)
9、《从0到1学习Flink》—— 介绍 Flink 中的 Stream Windows
10、《从0到1学习Flink》—— Flink 中的几种 Time 详解
11、《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 ElasticSearch
12、《从0到1学习Flink》—— Flink 项目如何运行?
13、《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 Kafka
14、《从0到1学习Flink》—— Flink JobManager 高可用性配置
15、《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍
16、《从0到1学习Flink》—— Flink 读取 Kafka 数据批量写入到 MySQL
17、《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 RabbitMQ
18、《从0到1学习Flink》—— 你上传的 jar 包藏到哪里去了
19、大数据“重磅炸弹”——实时计算框架 Flink
20、《Flink 源码解析》—— 源码编译运行
21、为什么说流处理即未来?
22、OPPO数据中台之基石:基于Flink SQL构建实数据仓库
23、流计算框架 Flink 与 Storm 的性能对比
24、Flink状态管理和容错机制介绍
25、原理解析 | Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理
26、Apache Flink 是如何管理好内存的?
27、《从0到1学习Flink》——Flink 中这样管理配置,你知道?
28、《从0到1学习Flink》——Flink 不可以连续 Split(分流)?
29、Flink 从0到1学习—— 分享四本 Flink 的书和二十多篇 Paper 论文
30、360深度实践:Flink与Storm协议级对比
31、Apache Flink 1.9 重大特性提前解读
32、如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了
33、美团点评基于 Flink 的实时数仓建设实践
34、Flink 灵魂两百问,这谁顶得住?
35、一文搞懂 Flink 的 Exactly Once 和 At Least Once
36、你公司到底需不需要引入实时计算引擎?
37、Flink 从0到1学习 —— 如何使用 Side Output 来分流?